package pe.tnova.generic.structure.project.springmvc.generic;

import java.util.logging.Logger;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;

import pe.tnova.generic.structure.project.springmvc.UI.OptionEntidadBean;
import pe.tnova.generic.structure.project.springmvc.soruce.SourceProjectCore;
import pe.tnova.generic.structure.project.springmvc.util.ConstantesTNOVA;

public class GenerarCapaDAO {

	private static final Logger LOG = Logger.getLogger(GenerarCapaDAO.class.getName());

	private OptionEntidadBean optionEntidadBean;
	private String strPackageBase;
	private IPackageFragment packIDAO;
	private IPackageFragment packDAO;

	// private SourceProjectCore sourceProjectCore;

	public GenerarCapaDAO(SourceProjectCore sourceProjectCore, OptionEntidadBean optionEntidadBean, String strPackageBase, IPackageFragment packIDAO, IPackageFragment packDAO) {
		this.optionEntidadBean = optionEntidadBean;
		this.strPackageBase = strPackageBase;
		this.packIDAO = packIDAO;
		this.packDAO = packDAO;
		// this.sourceProjectCore = sourceProjectCore;
		LOG.info("Generacion de codigo fuente DAO para " + optionEntidadBean.getNombreEntidad() + " DAO:" + optionEntidadBean.isCheckGeneraCodigoDAO() + " DAOBASE:"
				+ optionEntidadBean.isCheckGeneraCodigoDAOBASE() + " SERVICE:" + optionEntidadBean.isCheckGeneraCodigoSERVICE());
	}

	public void startGeneric() throws JavaModelException {
		LOG.info("Start Analisis generico");
		if (optionEntidadBean.isCheckGeneraCodigoDAO()) {
			ICompilationUnit interfazDAO = packIDAO.getCompilationUnit(optionEntidadBean.getNombreEntidad() + ConstantesTNOVA.CLASS_IDAO + ConstantesTNOVA.EXTENSION_JAVA);
			if (!interfazDAO.exists()) {
				packIDAO.createCompilationUnit(optionEntidadBean.getNombreEntidad() + ConstantesTNOVA.CLASS_DAO + ConstantesTNOVA.EXTENSION_JAVA,
						generarCodigoFuenteIDAO(optionEntidadBean.getNombreEntidad(), strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO), true, null);
			} 
			ICompilationUnit calseDAOImpl = packDAO.getCompilationUnit(optionEntidadBean.getNombreEntidad() + ConstantesTNOVA.CLASS_DAO_IMPL + ConstantesTNOVA.EXTENSION_JAVA);
			if (!calseDAOImpl.exists()) {
				packDAO.createCompilationUnit(optionEntidadBean.getNombreEntidad() + ConstantesTNOVA.CLASS_DAO_IMPL + ConstantesTNOVA.EXTENSION_JAVA,
						generarCodigoFuenteDAO(optionEntidadBean.getNombreEntidad(), strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_IMPL), true, null);
			}
		}
	}

	private String generarCodigoFuenteIDAO(String nameEntidad, String strRuta) {
		StringBuilder buffer = new StringBuilder();
		buffer.append("package " + strRuta + ";");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.IDAO;" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.CARPETA_DOMINIO + ConstantesTNOVA.DONT + nameEntidad + ";" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("public interface " + nameEntidad + "DAO extends IDAO<" + nameEntidad + "> {\n");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("}" + ConstantesTNOVA.EN);
		System.out.println(buffer.toString());
		return buffer.toString();
	}

	private String generarCodigoFuenteDAO(String nameEntidad, String strRuta) {
		StringBuilder buffer = new StringBuilder();
		buffer.append("package " + strRuta + ";");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.DAO;" + ConstantesTNOVA.EN);
		buffer.append("import org.springframework.stereotype.Repository;" + ConstantesTNOVA.EN);
		buffer.append("import org.slf4j.Logger;" + ConstantesTNOVA.EN);
		buffer.append("import org.slf4j.LoggerFactory;" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.CARPETA_DAO + ConstantesTNOVA.DONT + nameEntidad + "DAO;" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.CARPETA_DOMINIO + ConstantesTNOVA.DONT + nameEntidad + ";" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("@Repository(\"" + nameEntidad + "DAO\")"+ConstantesTNOVA.EN);
		buffer.append("public class " + nameEntidad + "DAOImpl extends DAO<" + nameEntidad + "> implements " + nameEntidad + "DAO {\n");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "private static final Logger logger = LoggerFactory.getLogger(" + nameEntidad + "DAOImpl.class);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("}" + ConstantesTNOVA.EN);
		System.out.println(buffer.toString());
		return buffer.toString();
	}

}
